#include "mainwindow.h"

#include <QApplication>

#include <iostream>
#include <CL/cl.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    w.show();


    //OpenCL方法：
    // cl_platform_id platform;
    // clGetPlatformIDs(1, &platform, nullptr);

    // // 获取设备
    // cl_device_id device;
    // clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, nullptr);

    // // 创建 OpenCL 上下文
    // cl_context context = clCreateContext(nullptr, 1, &device, nullptr, nullptr, nullptr);

    // // 创建命令队列
    // cl_command_queue queue = clCreateCommandQueue(context, device, 0, nullptr);

    // // OpenCL 内核代码
    // const char* kernelSource = R"(
    //     __kernel void helloOpenCL(__global int* data) {
    //         int id = get_global_id(0);
    //         data[id] = data[id] * 2;
    //     }
    // )";

    // // 创建并编译内核
    // cl_program program = clCreateProgramWithSource(context, 1, &kernelSource, nullptr, nullptr);
    // clBuildProgram(program, 1, &device, nullptr, nullptr, nullptr);

    // cl_kernel kernel = clCreateKernel(program, "helloOpenCL", nullptr);

    // // 创建缓冲区
    // cl_int data[] = { 1, 2, 3, 4, 5 };
    // cl_mem buffer = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(data), nullptr, nullptr);

    // // 将数据传输到 GPU
    // clEnqueueWriteBuffer(queue, buffer, CL_TRUE, 0, sizeof(data), data, 0, nullptr, nullptr);

    // // 设置内核参数
    // clSetKernelArg(kernel, 0, sizeof(cl_mem), &buffer);

    // // 执行内核
    // size_t globalSize = 5;
    // clEnqueueNDRangeKernel(queue, kernel, 1, nullptr, &globalSize, nullptr, 0, nullptr, nullptr);

    // // 从 GPU 获取数据
    // clEnqueueReadBuffer(queue, buffer, CL_TRUE, 0, sizeof(data), data, 0, nullptr, nullptr);

    // // 输出结果
    // std::cout << "Result: ";
    // for (int i = 0; i < 5; ++i) {
    //     std::cout << data[i] << " ";
    // }
    // std::cout << std::endl;

    // // 清理资源
    // clReleaseMemObject(buffer);
    // clReleaseKernel(kernel);
    // clReleaseProgram(program);
    // clReleaseCommandQueue(queue);
    // clReleaseContext(context);


    return a.exec();
}
